Primeiros Passos com ggplot2
Lineu Alberto Cavazani de Freitas
Parte primordial de qualquer análise estatística é chamada análise descritiva ou exploratória. Tal etapa consiste basicamente de resumos numéricos e análises gráficas baseadas em conjuntos de dados.
Trata-se de uma etapa de extrema importância e deve preceder qualquer análise mais sofisticada como ajuste de modelos de regressão, por exemplo. Além disso, a análise exploratória não requer elevada proficiência em tópicos de estatística avançada para para aplicação e interpretação dos resultados fazendo com que visualização de dados caracteriza uma técnica simples, com grande apelo visual e extremamente informativa quanto ao conjunto de dados.
No R há a possibilidade de gerar gráficos sem a utilização de pacotes e há também pacotes específicos e especializados em visualização, dentre os quais destacam-se os famosos lattice e ggplot2.
Este post tem como foco explorar as principais e mais simples formas de visualização de dados utilizando o ggplot2 bem como algumas customizações simples como alteração de cores, temas, etc.
ggplot2O ggplot2 é um pacote para geração de gráficos baseado no livro ‘The Grammar of Graphics’. Nele, o usuário fornece os dados, especifica como mapear as variáveis e que tipo de visualização usar, após isso basta customizar cores, formas e tamanho dos atributos.
Para instalação do pacote basta utilizar a função install.packages.
install.packages('ggplot2')A principal função do pacote é a ggplot(). Esta função cria um objeto ggplot no qual devem ser declarados os dados e especificar o conjunto de características que vão compor o gráfico.
Leia a documentação da função com o comando:
?ggplot()O primeiro passo para abrir uma janela gráfica no ggplot2 é especificar o data frame no argumento data e, dentro do aes() informar qual variável ficará no eixo x e qual ficará no eixo y. Além disso pode-se acrescentar outras variáveis ao aes() que serão representadas por cores, formas ou tamanhos diferentes.
ggplot(data = NULL, mapping = aes())Apenas o comando acima abre uma janela em branco, para acrescentar pontos, linhas e formas ao gráfico são utilizados os ‘geoms’ do ggplot. Os geoms disponíveis do pacote são:
## [1] "geom_abline" "geom_area" "geom_bar"
## [4] "geom_bin2d" "geom_blank" "geom_boxplot"
## [7] "geom_col" "geom_contour" "geom_count"
## [10] "geom_crossbar" "geom_curve" "geom_density"
## [13] "geom_density_2d" "geom_density2d" "geom_dotplot"
## [16] "geom_errorbar" "geom_errorbarh" "geom_freqpoly"
## [19] "geom_hex" "geom_histogram" "geom_hline"
## [22] "geom_jitter" "geom_label" "geom_line"
## [25] "geom_linerange" "geom_map" "geom_path"
## [28] "geom_point" "geom_pointrange" "geom_polygon"
## [31] "geom_qq" "geom_qq_line" "geom_quantile"
## [34] "geom_raster" "geom_rect" "geom_ribbon"
## [37] "geom_rug" "geom_segment" "geom_sf"
## [40] "geom_smooth" "geom_spoke" "geom_step"
## [43] "geom_text" "geom_tile" "geom_violin"
## [46] "geom_vline"
A sintaxe para geração de um gráfico de dispersão simples é:
ggplot(data = dados, # conjunto de dados
mapping = aes(x = x, # variável x
y = y)) + # variável y
geom_point() # especifica que x e y serão representados como pares ordenados Pode-se acrescentar mais de um geom ao mesmo gráfico apenas com o acréscimo do sinal de mais (+).
Para verificar os tipos de gráficos mais comuns em análise exploratória e como customizar gráficos com o ggplot2, vamos analisar um conjunto de dados simulados.
Vamos gerar e analisar um conjunto de dados tradicional composto por duas variáveis numéricas e uma variável categórica:
# gerando dois vetores
v1 = rnorm(1500, 20, 5)
v2 = rnorm(1500, 20, 5 )
x = v1*2
y = v1+v2
z = rep(c('a','b'), 750)
df <- data.frame(x=x,y=y,z=z)
head(df)## x y z
## 1 31.61067 35.11138 a
## 2 46.96268 43.00292 b
## 3 44.18966 42.14678 a
## 4 33.99729 23.37712 b
## 5 46.76924 50.93995 a
## 6 27.92536 37.30418 b
Uma análise básica do conjunto de dados gerado utilizando as funções base do R:
par(mfrow = c(1,3), par(oma=c(0,3,3,0)))
hist(df$y,probability = T, main = 'Histograma',col=3)
box()
lines(density(df$y), lwd=3, col=4)
plot(y~z, df, col = c(3,4), main='Boxplot')
mtext("Gráficos Base", side=3, line=3, cex=1 )
plot(y~x,df, col=c(3,4), main='Gráfico de Dispersão')
abline(lm(y~x, df), lwd=3)ggplot2Como o ggplot2 é um pacote, é necessário carregá-lo:
library(ggplot2)Um gráfico de densidade simples pode ser feito com os seguintes comandos:
ggplot(data=df, mapping = aes(x=y))+
geom_density()Dentro de um geom é possível acrescentar elementos extra para customização dos gráficos, por exemplo: o argumento col altera a cor do contorno, o argumento fill altera a cor de preenchimento e o alpha controla o aspecto de transparência do gráfico. Pode-se também acrescentar um geom_rug():
ggplot(data=df, mapping = aes(x=y)) +
geom_density(col=4,
fill='#088A85',
alpha=0.3) +
geom_rug()Para gerar um histograma, basta acrescentar à função ggplot um geom_histogram():
ggplot(data=df, mapping = aes(x=x)) +
geom_histogram()E pode-se incluir as mesmas customizações utilizadas no gráfico de densidade:
ggplot(data=df, mapping = aes(x=y)) +
geom_histogram(col=6, fill='#00FFFF', alpha=0.3) +
geom_rug(col=2, alpha=0.5)Ainda com foco nas análises univariadas, uma alternativa ao gráfico de densidade e ao histograma é o boxplot:
ggplot(data=df, mapping = aes(y=y)) +
geom_boxplot(col=3, fill=3, alpha=0.4)Para duas variáveis numéricas o gráfico de maior importância é o de dispersão, que pode ser gerado utilizando o geom_point():
ggplot(data=df, mapping = aes(x=x,y=y)) +
geom_point()Pode-se ainda gerar um gráfico utilizando todas as variáveis do nosso data frame, com uma variável numérica no eixo x, outra no eixo y e com diferentes cores representando a variável categórica, tais atributos são definidos dentro do aes(). Há a possibilidade de adicionar linhas de tendência ao gráfico com o uso do geom_smooth():
ggplot(data=df, mapping = aes(x=x,y=y,col=z)) +
geom_point(alpha=0.8) +
geom_smooth(method = 'lm', col=1) +
geom_rug(alpha=0.1)Para verificar o comportamento de uma variável categórica nos valores observados de uma variável numérica o boxplot se mostra uma boa alternativa, a diferença do caso já mencionado é que aqui temos uma variável x (fator) e uma variável y (numérica):
ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot()E algumas customizações:
ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot(col=c(3,4), fill=c(3,4), alpha=0.3)A atribuição de eixos e títulos faz-se com uso do ggtitle(), xlab() e ylab():
ggplot(data=df, mapping = aes(x=x,y=y))+
geom_point(alpha=0.5)+
ggtitle('Título')+
xlab('Eixo x')+
ylab('Eixo y')O facet_wrap() permite gerar gráficoa em que faz-se a distinção entre os níveis de um fator:
ggplot(data=df, mapping = aes(x=x,y=y,col=z)) +
geom_point(alpha=0.5)+
geom_smooth(se=F, lwd=1.5, col=1) +
facet_wrap(~z)Além dos gráficos já mencionados, alguns outros são comumentes usados em análises exploratória:
O gráfico de barras é utilizado quado tem-se interesse em observar frequências, no ggplot pode ser gerado da seguinte forma:
dados <- data.frame(fator = factor(c("a","b","c","d","e"),
levels=c("a","b","c","d","e")),
contagem = c(125, 170, 124, 128, 163))
ggplot(data=dados, aes(x=fator, y=contagem)) +
geom_bar(stat="identity",
fill=5,
col=4,
alpha=0.2,
lwd=1)+
geom_text(aes(label=contagem),
vjust=1.6,
color=1,
size=3.5)+
ylab("") +
xlab("")Outra alternativa para visualização de frequências é o gráfico de setores:
dados <- data.frame(fator = factor(c("a","b","c","d","e","f"),
levels=c("a","b","c","d","e", "f")),
contagem = c(125, 170, 124, 128, 163, 500))
ggplot(dados, aes(x="", y=contagem, fill=fator))+
geom_bar(width = 1, stat = "identity", col='white', alpha=0.5)+
coord_polar("y", start=0)Para confecção deste gráfico utiliza-se o geom_violin(), o gráfico consiste no espelhamento do gráfico de densidade da variável; pode ser utilizado para explorar uma variável numérica ou para verificar o efeito de níveis de um fator sobre uma variável numérica:
dados <- data.frame(x = rep(c('a','b','c','d'),50),
y = rgamma(200, 12,3))
ggplot(data=dados, mapping = aes(x=x,
y=y,
fill=x,
col=x))+
geom_violin(alpha=0.5, lwd=2)+
theme(legend.position = 'none')O clássico par(mfrow = c()) não é aplicável a gráficos ggplot2. Porém é possível gerar gráficos em painel através da função grid.arrange do pacote gridExtra:
library(gridExtra)library(gridExtra)g1 <- ggplot(data=df, mapping = aes(x=y))+
geom_density(col=2, fill=2, alpha=0.3)
g2 <- ggplot(data=df, mapping = aes(x=y))+
geom_histogram(col=6, fill=6, alpha=0.3)
g3 <- ggplot(data=df, mapping = aes(x=x,y=y,col=z))+
geom_point(alpha=0.5)+
geom_smooth(col=1)
g4 <- ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot(col=c(3,4),
fill=c(3,4),
alpha=0.3)grid.arrange(g1,g2,g3,g4,nrow=2,ncol=2)O pacote tem uma variedade de temas:
library(ggplot2)
temas <- ls("package:ggplot2")
ind <- grep('theme_', temas)
temas[ind[]]## [1] "theme_bw" "theme_classic" "theme_dark" "theme_get"
## [5] "theme_gray" "theme_grey" "theme_light" "theme_linedraw"
## [9] "theme_minimal" "theme_replace" "theme_set" "theme_test"
## [13] "theme_update" "theme_void"
Para utlizálos, basta acrescentar + theme_(nome do tema). Alguns são extremamente parecidos. Confira os principais:
tema <- data.frame(x=1,y=1)
graf <- ggplot(data=tema, mapping = aes(x=x,y=y))
a <- graf+theme_bw()+ggtitle('bw')+xlab('')+ylab('')
b <- graf+theme_classic()+ggtitle('classic')+xlab('')+ylab('')
c <- graf+theme_dark()+ggtitle('dark')+xlab('')+ylab('')
d <- graf+theme_gray()+ggtitle('gray')+xlab('')+ylab('')
e <- graf+theme_light()+ggtitle('light')+xlab('')+ylab('')
f <- graf+theme_minimal()+ggtitle('minimal')+xlab('')+ylab('')
g <- graf+theme_test()+ggtitle('test')+xlab('')+ylab('')
h <- graf+theme_void()+ggtitle('void')+xlab('')+ylab('')
grid.arrange(a,b,c,d,e,f,g,h, nrow=3,ncol=3)Com o pacote plotly é possível converter gráficos gerados com ggplot2 em gráficos interativos com o uso da função ggplotly:
install.packages('plotly')ind <- sample(nrow(diamonds),4500,replace = F)
graf <-
ggplot(data=diamonds[ind,], aes(x=price,y=carat,col=clarity)) +
geom_point(alpha=0.5) +
geom_rug(alpha=0.1, col='#F781F3')+
geom_smooth(method='lm',se=F, col=1)+
geom_smooth(method='loess',se=F,
col='#FF0040',
linetype = 'longdash')
library(plotly)
ggplotly(graf)graf2 <-
ggplot(data=diamonds[ind,], aes(x=table,y=depth,col=cut))+
geom_point(alpha=0.3)+
geom_smooth(method='lm',se=F, col=1)+
facet_wrap(~clarity)+
theme_light()+
theme(legend.position = 'none')
ggplotly(graf2)O intuito deste material foi explorar a confecção e customização de gráficos fazendo uso do ggplot2. O aprendizado e a própria customização dos gráficos pode ser de certa forma trabalhosa devido às diferenças de sintaxe dos gráficos produzidos no R e às inúmeras possíveis combinações de geoms e parâmetros que controlam a estética dos gráficos. Contudo, o pacote permite a geração de gráficos que, no geral, são mais atrativos visualmente que aqueles gerados utilizando o R base e que, com uso do plotly, são facilmente convertidos para gráficos interativos.